home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 52
/
Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso
/
Aminet
/
misc
/
emu
/
Apex-src.lha
/
SET.XPL
< prev
next >
Wrap
Text File
|
2001-09-30
|
7KB
|
303 lines
\SET.XPL DEC-08-88
\Utility to set .SAV file parameters for Apex version 1.8.
\REVISION HISTORY:
\NOV-08-85, Restricted buffers to page boundaries and cleaned up, L.B.
\FEB-26-86, Modified for 68000 Apex, L.B.
\SEP-OCT-86, Modified for new system page parameters.
\NOV-18-86, Modified to handle large numbers
\APR-11-87, Changed string conventions, hex-only input.
\JUL-02-88, Changed buffer end address to end with $FF, disallow odd
\ addresses, misc. clean up.
\DEC-08-88, Fix tabs
code REM=2, RESERVE=3, SWAP=4, CHIN=7,
CHOUT=8, CRLF=9, TEXT=12, OPENI=13,
READ=31, WRITE=30, ABORT=16, HEXOUT=27;
\THE SYSTEM GLOBALS:
int UNIT, \Unit number the .SAV file is on
FIRBLK, \First block of .SAV file
CHAR, \Input character
SPECIAL, \Special bits in program file request
NEWSPEC, \"BACK UP", "SIZE LIMIT", and "KEEP DATE" flag bits
INLBLK; \Low block number of .SAV file
addr PARM, \System page parameters
SYSPAG; \256-byte array to hold first block of the .SAV file
\ASCII CONSTANTS:
def CR= $0D, TAB= $09, BEL= $07;
\FILE STATUS IN SYSTEM PAGE:
def NOFILE= 0, SETUP= 1, CLOSED= 255;
\OFFSETS INTO THE SYSTEM PAGE:
\ (See main for additional definitions)
def VSTART= $02, \Jump vector addresses (+2 to skip JMP)
VRSTRT= $08,
VEXIT= $0E,
VERR= $14,
VABORT= $1A,
DEXTO= $5B, \Default extension for output file
DEXTI= $61, \Default extension for input file
DEFAUL= $67, \Special default flag byte
SYBOMB= $68, \Flag: User program bombs system
\32-BIT PARAMETERS IN SYSPAG:
HEAP= $6E, \Start of user heap space
STACK= $72, \Start of user stack space
OTBUF= $86,
OTBUFE= $8A,
INBUF= $8E,
INBUFE= $92,
INFLG= $16A, \Input file status flag
INUNT= $16C; \Device number input file is on
\----------------------------------------------------------------------
proc ERROR(STR); \Report error
addr STR;
begin
CHOUT(0, BEL);
TEXT(0, "NOPE - "); TEXT(0, STR);
CRLF(0);
end; \ERROR
\----------------------------------------------------------------------
proc NEXT; \Get next character and convert to uppercase
begin
CHAR:= CHIN(0);
if CHAR>=^a & CHAR<=^z then CHAR:= CHAR & $DF;
end; \NEXT
\----------------------------------------------------------------------
func PEEK32(ADDR); \Returns the 32-bit value at the given address
int ADDR;
return ADDR(0);
proc POKE32(ADDR, VALUE); \Store the 32-bit value at the given address
int ADDR, VALUE;
ADDR(0):= VALUE;
\----------------------------------------------------------------------
func GETHEX; \Input a hex number from the operator
int I, ADD; \First digit is already read in
func NUMERIC;
int DUMMY;
return CHAR>=^0 & CHAR<=^9;
func HEX;
int DUMMY;
return NUMERIC ! (CHAR>=^A & CHAR<=^Z);
begin
while not HEX do NEXT;
I:= 0;
while HEX do
begin
if CHAR < ^A then ADD:= CHAR -^0
else ADD:= CHAR -^A +10;
I:= I <<4 + ADD;
NEXT;
end;
return I;
end; \GETHEX
\----------------------------------------------------------------------
proc GETADDR(OFF); \Show and optionally get an address
int OFF; \Offset into SYSPAG
int I;
begin
CHOUT(0, ^$); HEXOUT(0, PEEK32(SYSPAG+OFF));
TEXT(0, " $");
OPENI(0);
NEXT;
if CHAR # CR then
begin
loop begin
I:= GETHEX;
if (I&$01)=0 then quit;
ERROR("MUST BE AN EVEN ADDRESS");
end;
POKE32(SYSPAG+OFF, I);
end;
end; \GETADDR
\----------------------------------------------------------------------
proc SHOWBOOL(TXT, FLAG); \Show message and boolean value (T/F)
addr TXT;
int FLAG;
begin
TEXT(0, TXT);
CHOUT(0, TAB);
if FLAG then CHOUT(0, ^T) else CHOUT(0, ^F);
CHOUT(0, ^ );
end; \SHOWBOOL
\----------------------------------------------------------------------
proc GETEXT(DFEXT); \Show and optionally get default extension for file
int DFEXT;
int I;
begin
for I:= 0, 2 do CHOUT(0, SYSPAG(DFEXT +I));
OPENI(0);
TEXT(0, " ");
NEXT;
if CHAR # CR then
begin
for I:= 0, 2 do
begin
if CHAR>=$20 & CHAR#^. then
SYSPAG(DFEXT+I):= CHAR
else I:= I-1;
NEXT;
end;
end;
end; \GETEXT
\----------------------------------------------------------------------
proc GETBUF(START, END);
\Show and optionally get the starting and ending buffer addresses
int START, END;
int I;
begin
CHOUT(0, ^$); HEXOUT(0, PEEK32(SYSPAG+START));
CHOUT(0, ^-);
CHOUT(0, ^$); HEXOUT(0, PEEK32(SYSPAG+END)-1);
TEXT(0, " $");
OPENI(0);
NEXT;
if CHAR # CR then
begin \Get new number from operator
loop begin
I:= GETHEX;
if (I&$FF)=0 then quit;
ERROR("MUST START ON PAGE BOUNDARY");
end;
POKE32(SYSPAG+START, I);
loop begin
I:= GETHEX;
if (I&$FF)=$FF then quit;
ERROR("MUST END ON PAGE BOUNDARY");
end;
POKE32(SYSPAG+END, I+1);
end;
end; \GETBUF
\----------------------------------------------------------------------
begin \MAIN
SYSPAG:= RESERVE(256);
TEXT(0, "-- SET, V1.8x4 --
");
PARM:= $0400; \Location of resident system page
INLBLK:= $562;
if PARM(INFLG) # SETUP then [ERROR("NEED .SAV FILE"); ABORT];
UNIT:= PARM(INUNT); \Get the input file unit number
FIRBLK:= INLBLK(0); \Get input file's starting block no.
READ(UNIT, FIRBLK, SYSPAG, 1); \Read in SYSPAG
repeat begin
TEXT(0, "START: ");
GETADDR(VSTART);
TEXT(0, "RESTART: ");
GETADDR(VRSTRT);
TEXT(0, "EXIT: ");
GETADDR(VEXIT);
TEXT(0, "ERROR EXIT: ");
GETADDR(VERR);
TEXT(0, "ABORT EXIT: ");
GETADDR(VABORT);
TEXT(0, "HEAP: ");
GETADDR(HEAP);
TEXT(0, "STACK: ");
GETADDR(STACK);
CRLF(0);
TEXT(0, "DEFAULT OUTPUT EXTENSION: ");
GETEXT(DEXTO);
TEXT(0, "DEFAULT INPUT EXTENSION: ");
GETEXT(DEXTI);
CRLF(0);
SHOWBOOL("SYSBOMB:", SYSPAG(SYBOMB));
OPENI(0);
NEXT;
SYSPAG(SYBOMB):= (if CHAR=^F then 0
else (if CHAR=^T then $FF else (SYSPAG(SYBOMB))));
SPECIAL:= SYSPAG(DEFAUL); \GET SYSTEM FLAGS
SHOWBOOL("BACKUP: ", SPECIAL&1);
OPENI(0);
NEXT;
NEWSPEC:= (if CHAR=^F then 0
else (if CHAR=^T then 1 else (SPECIAL&1)));
SHOWBOOL("SIZE LIMIT:", SPECIAL&2);
OPENI(0);
NEXT;
NEWSPEC:= NEWSPEC ! (if CHAR=^F then 0
else (if CHAR=^T then 2 else (SPECIAL&2)));
SHOWBOOL("KEEP DATE:", SPECIAL&4);
OPENI(0);
NEXT;
NEWSPEC:= NEWSPEC ! (if CHAR=^F then 0
else (if CHAR=^T then 4 else (SPECIAL&4)));
SYSPAG(DEFAUL):= NEWSPEC;
CRLF(0);
TEXT(0, "OUTPUT BUFFER: ");
GETBUF(OTBUF, OTBUFE);
TEXT(0, "INPUT BUFFER: ");
GETBUF(INBUF, INBUFE);
CRLF(0);
TEXT(0, "SATISFIED (N/Y)? ");
OPENI(0);
NEXT;
CRLF(0);
end;
until (CHAR!$20) = ^y;
WRITE(UNIT, FIRBLK, SYSPAG, 1);
end; \MAIN
SFIED (N/Y)? ");
OPENI(0);
NEXT;
CRLF(0);
end;
until (CHAR!$20) = ^y;
WRITE(UNIT, FIRBLK, SYSPAG, 1